#遍历整个列表你经常需要遍历列表的所有元素，对每个元素执行相同的操作。例如，在游戏中，可能需要将每个界面元素平移相同的距离；对于包含数字的列表，可能需要对每个元素执行相同的统计运算；在网站中，可能需要显示文章列表中的每个标题。需要对列表中的每个元素都执行相同的操作时，可使用Python中的for循环。

#假设我们有一个魔术师名单，需要将其中每个魔术师的名字都打印出来。为此，我们可以分别获取名单中的每个名字，但这种做法会导致多个问题。例如，如果名单很长，将包含大量重复的代码。另外，每当名单的长度发生变化时，都必须修改代码。通过使用for循环，可让Python去处理这些问题。

#这行代码让Python从列表magicians中取出一个名字，并将其存储在变量magician中。最后，我们让Python打印前面存储到变量magician中的名字（见❸）。这样，对于列表中的每个名字，Python都将重复执行❷处和❸处的代码行。你可以这样解读这些代码：对于列表magicians中的每位魔术师，都将其名字打印出来。输出很简单，就是列表中所有的姓名：
#Python中的for循环可以用来遍历列表中的每个元素。语法格式如下：
magicians = ['alice','david','carolina'] 
for magician in magicians:
    print(magician) 

#深入地研究循环循环这种概念很重要，因为它是让计算机自动完成重复工作的常见方式之一
#for magician in magicians:这行代码让Python获取列表magicians中的第一个值('alice')，并将其存储到变量magician中。接下来，Python读取下一行代码：
#另外，编写for循环时，对于用于存储列表中每个值的临时变量，可指定任何名称。然而，选择描述单个列表元素的有意义的名称大有帮助。例如，可以将magician变量命名为current_magician，这样代码的意思就更清晰了：

#在for循环中执行更多的操作在for循环中，可对每个元素执行任何操作。下面来扩展前面的示例，对于每位魔术师，都打印一条消息，指出他的表演太精彩了。
magicians = ['alice','david','carolina']
for magician in magicians:
    print(magician.title()+",that was a great trick!") 
#相比于前一个示例，唯一的不同是对于每位魔术师，都打印了一条以其名字为抬头的消息（见❶）。这个循环第一次迭代时，变量magician的值为'alice'，因此Python打印的第一条消息的抬头为'Alice'。第二次迭代时，消息的抬头为'David'，而第三次迭代时，抬头为'Carolina'。下面的输出表明，对于列表中的每位魔术师，都打印了一条个性化消息：
# Alice,that was a great trick!
# David,that was a great trick!
# Carolina,that was a great trick!
#在for循环中，想包含多少行代码都可以。在代码行formagician in magicians后面，每个缩进的代码行都是循环的一部分，且将针对列表中的每个值都执行一次。因此，可对列表中的每个值执行任意次数的操作。

#避免缩进错误Python根据缩进来判断代码行与前一个代码行的关系。在前面的示例中，向各位魔术师显示消息的代码行是for循环的一部分，因为它们缩进了。Python通过使用缩进让代码更易读；简单地说，它要求你使用缩进让代码整洁而结构清晰。在较长的Python程序中，你将看到缩进程度各不相同的代码块，这让你对程序的组织结构有大致的认识。

#循环后不必要的缩进如果你不小心缩进了应在循环结束后执行的代码，这些代码将针对每个列表元素重复执行。在有些情况下，这可能导致Python报告语法错误，但在大多数情况下，这只会导致逻辑错误。


#创建数值列表需要存储一组数字的原因有很多，例如，在游戏中，需要跟踪每个角色的位置，还可能需要跟踪玩家的几个最高得分。  在数据可视化中，处理的几乎都是由数字（如温度、距离、人口数量、经度和纬度等）组成的集合。列表非常适合用于存储数字集合，而Python提供了很多工具，可帮助你高效地处理数字列表。
#使用函数range()Python函数range()让你能够轻松地生成一系列的数字。例如，可以像下面这样使用函数range()来打印一系列的数字
for value in range(1,5):
    print(value)
# 1
# 2
# 3
# 4
# 5
#上述代码好像应该打印数字1～5，但实际上它不会打印数字5：
#在这个示例中，range()只是打印数字1～4，这是你在编程语言中经常看到的差一行为的结果。函数range()让Python从你指定的第一个值开始数，并在到达你指定的第二个值后停止，因此输出不包含第二个值（这里为5）。要打印数字1～5，需要使用range(1,6)：

#要创建数字列表，可使用函数list()将range()的结果直接转换为列表。如果将range()作为list()的参数，输出将为一个数字列表。
#要将一系列数字转换成一个列表可以使用list()
numbers = list(range(1,6))
print(numbers)

#使用函数range()时，还可指定步长。例如，下面的代码打印1～10内的偶数：
even_numbers = list(range(2,11,2))
print(even_numbers)
# 在这个示例中，函数range()从2开始数，然后不断地加2，直到达到或超过终值(11)，因此输出如下：
# [2,4,6,8,10]

#使用函数range()几乎能够创建任何需要的数字集，例如，如何创建一个列表，其中包含前10个整数（即1～10）的平方呢？在Python中，两个星号(**)表示乘方运算。下面的代码演示了如何将前10个整数的平方加入到一个列表中：
squares = [] 
for value in range(1,11):
    square = value**2 
    squares.append(square) 
print(squares) 
#首先，我们创建了一个空列表（见❶）；接下来，使用函数range()让Python遍历1～10的值（见❷）。在循环中，计算当前值的平方，并将结果存储到变量square中（见❸）。然后，将新计算得到的平方值附加到列表squares末尾（见❹）。最后，循环结束后，打印列表squares（见❺）：
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]    
#首先应该考虑的是，编写清晰易懂且能完成所需功能的代码；等到审核代码时，再考虑采用更高效的方法。


#对数字列表执行简单的统计计算有几个专门用于处理数字列表的Python函数。例如，你可以轻松地找出数字列表的最大值、最小值和总和：


#列表解析前面介绍的生成列表squares的方式包含三四行代码，而列表解析让你只需编写一行代码就能生成这样的列表。列表解析将for循环和创建新元素的代码合并成一行，并自动附加新元素。面向初学者的书籍并非都会介绍列表解析，这里之所以介绍列表解析，是因为等你开始阅读他人编写的代码时，很可能会遇到它们。下面的示例使用列表解析创建你在前面看到的平方数列表
squares = [value**2 for value in range(1,11)]
print(squares)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]    
#要使用这种语法，首先指定一个描述性的列表名，如squares；然后，指定一个左方括号，并定义一个表达式，用于生成你要存储到列表中的值。在这个示例中，表达式为value**2，它计算平方值。接下来，编写一个for循环，用于给表达式提供值，再加上右方括号。在这个示例中，for循环为for value in range(1,11)，它将值1～10提供给表达式value**2。请注意，这里的for语句末尾没有冒号。结果与你在前面看到的平方数列表相同：

#切片要创建切片，可指定要使用的第一个元素和最后一个元素的索引。与函数range()一样，Python在到达你指定的第二个索引前面的元素后停止。要输出列表中的前三个元素，需要指定索引0～3，这将输出分别为0、1和2的元素。下面的示例处理的是一个运动队成员列表：
players = ['charles','martina','michael','florence','eli']
print(players[0:3]) 
#处的代码打印该列表的一个切片，其中只包含三名队员。输出也是一个列表，其中包含前三名队员：
# ['charles','martina','michael']
#如果你没有指定第一个索引，Python将自动从列表开头开始：
print(players[:3]) 
# 输出同样是列表，只包含前三名队员：
# ['charles','martina','michael']
#要让切片终止于列表末尾，也可使用类似的语法。例如，如果要提取从第3个元素到列表末尾的所有元素，可将起始索引指定为2，并省略终止索引：
print(players[2:]) 
# ['michael','florence','eli']
#如果你要输出名单上的最后三名队员，可使用切片players[-3:]：

# 遍历切片如果要遍历列表的部分元素，可在for循环中使用切片。在下面的示例中，我们遍历前三名队员，并打印他们的名字
players = ['charles','martina','michael','florence','eli']
print("Here are the first three players on my team:")
for player in players[:3]:
    print(player.title())
# Here are the first three players on my team:
# Charles
# Martina
# Michael
#在很多情况下，切片都很有用。例如，编写游戏时，你可以在玩家退出游戏时将其最终得分加入到一个列表中。然后，为获取该玩家的三个最高得分，你可以将该列表按降序排列，再创建一个只包含前三个得分的切片。处理数据时，可使用切片来进行批量处理；编写Web应用程序时，可使用切片来分页显示信息，并在每页显示数量合适的信息。

#要复制列表，可创建一个包含整个列表的切片，方法是同时省略起始索引和终止索引([:])。这让Python创建一个始于第一个元素，终止于最后一个元素的切片，即复制整个列表。例如，假设有一个列表，其中包含你最喜欢的三种食品，而你还想创建另一个列表，在其中包含一位朋友喜欢的所有食品。不过，你喜欢的食品，这位朋友都喜欢，因此你可以通过复制来创建这个列表：
# 我们首先创建了一个名为my_foods的食品列表（见❶），然后创建了一个名为friend_foods的新列表（见❷）。我们在不指定任何索引的情况下从列表my_foods中提取一个切片，从而创建了这个列表的副本，再将该副本存储到变量friend_foods中。打印每个列表后，我们发现它们包含的食品相同：
my_foods = ['pizza','falafel','carrot cake'] 
friend_foods = my_foods[:] 
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)
# 接下来，在每个列表中都添加一种食品：在列表my_foods中添加'cannoli'（见❷），而在friend_foods中添加'ice cream'（见❸）。最后，打印这两个列表，核实这两种食品包含在正确的列表中。
my_foods = ['pizza','falafel','carrot cake']
friend_foods = my_foods[:] 
my_foods.append('cannoli') 
friend_foods.append('ice cream') 
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)
# My favorite foods are:
# ['pizza','falafel','carrot cake','cannoli'] ❹
# My friend's favorite foods are:
# ['pizza','falafel','carrot cake','ice cream'] ❺
# ❹处的输出表明，'cannoli'包含在你喜欢的食品列表中，而'ice cream'没有。❺处的输出表明，'ice cream'包含在你朋友喜欢的食品列表中，而'cannoli'没有。倘若我们只是简单地将my_foods赋给friend_foods，就不能得到两个列表。例如，下例演示了在不使用切片的情况下复制列表的情况
my_foods = ['pizza','falafel','carrot cake']
#这行不通
friend_foods = my_foods 
my_foods.append('cannoli')
friend_foods.append('ice cream')
print("My favorite foods are:")
print(my_foods)
print("\nMy friend's favorite foods are:")
print(friend_foods)
# 这里将my_foods赋给friend_foods，而不是将my_foods的副本存储到friend_foods（见❶）。这种语法实际上是让Python将新变量friend_foods关联到包含在my_foods中的列表，因此这两个变量都指向同一个列表。鉴于此，当我们将'cannoli'添加到my_foods中时，它也将出现在friend_foods中；同样，虽然'ice cream'好像只被加入到了friend_foods中，但它也将出现在这两个列表中。输出表明，两个列表是相同的，这并非我们想要的结果：
# My favorite foods are:
# ['pizza','falafel','carrot cake','cannoli','ice cream']
# My friend's favorite foods are:
# ['pizza','falafel','carrot cake','cannoli','ice cream']

# 元组列表非常适合用于存储在程序运行期间可能变化的数据集。列表是可以修改的，这对处理网站的用户列表或游戏中的角色列表至关重要。然而，有时候你需要创建一系列不可修改的元素，元组可以满足这种需求。Python将不能修改的值称为不可变的，而不可变的列表被称为元组。
#元组看起来犹如列表，但使用圆括号而不是方括号来标识。定义元组后，就可以使用索引来访问其元素，就像访问列表元素一样。

#如果有一个大小不应改变的矩形，可将其长度和宽度存储在一个元组中，从而确保它们是不能修改的
dimensions = (200,50) 
print(dimensions[0]) 
print(dimensions[1])
# 操作和列表基本没有区别这边就不做赘述了，主要是介绍一下元组的概念，元组和列表的区别在于元组不可修改，列表可修改，元组用小括号，列表用方括号

#小结
#本章介绍了Python中的列表和元组，以及如何使用它们来存储和处理数据。列表是可变的，可以随时添加、删除或修改元素；元组是不可变的，一旦创建就不能修改。列表和元组都可以包含不同的数据类型，并且可以包含列表或元组。列表和元组的操作有很多，包括遍历、切片、复制、统计计算等。